/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.gbvbahia.projeto.web.pessoal;

import br.com.gbvbahia.projeto.beans.facade.interfaces.UsuarioFacade;
import br.com.gbvbahia.projeto.entidades.Usuario;
import br.com.gbvbahia.projeto.exceptions.EntityException;
import br.com.gbvbahia.projeto.service.AuthenticationService;
import br.com.gbvbahia.projeto.web.jsfutil.JsfUtil;
import br.com.gbvbahia.utils.Base64Encoder;
import br.com.gbvbahia.utils.MensagemUtils;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.apache.log4j.Logger;

/**
 * Bean para ateração de senha do usuário.
 *
 * @since v.1 19/05/2012
 * @author Guilherme
 */
@ManagedBean
@RequestScoped
public class PasswordController {

    /**
     * Registra os eventos para debug em desenvolvimento.
     */
    private Logger logger = Logger.getLogger(PasswordController.class);
    /**
     * Facade injetado pelo Spring para CRUD com usuário. <br> <b>Não
     * pode faltar setter para a injeção ocorrer</b>
     */
    @ManagedProperty("#{usuarioFacade}")
    private UsuarioFacade usuarioFacade;
    /**
     * Componente que contém o usuário logado.
     */
    @ManagedProperty("#{authenticationService}")
    private AuthenticationService authenticationService;
    /**
     * Recebe a nova senha digitada.
     */
    private String senha;
    /**
     * Senha atual para confirmação.
     */
    private String senhaAtual;

    //====================
    //Iniciadores
    //====================
    /**
     * Executado após o bean JSF ser criado.
     */
    @PostConstruct
    public void init() {
        logger.info("init()...");
    }

    /**
     * Executado antes do bean JSF ser destruído.
     */
    @PreDestroy
    public void end() {
        logger.info("end()...");
    }

    /**
     * Creates a new instance of PasswordController.
     */
    public PasswordController() {
    }

    //====================
    //Métodos de Ação
    //====================
    /**
     * Altera a senha atual do usuário.
     *
     * @return Fluxo de exibição.
     */
    public String alterarSenha() {
        Usuario userLogado = this.authenticationService.getUsuarioLogado();
        if (!Base64Encoder.encryptPassword(senhaAtual).equals(userLogado.getPass())) {
            logger.warn("Tentativa de alterar senha, senha atual"
                    + " inválida para: " + userLogado.getUserId());
            MensagemUtils.messageFactoringFull("PasswordError",
                    new Object[]{userLogado.getFirstName()},
                    FacesMessage.SEVERITY_ERROR,
                    FacesContext.getCurrentInstance());
            return JsfUtil.MANTEM;
        }
        try {
            this.usuarioFacade.alterarSenha(userLogado, senha);
            MensagemUtils.messageFactoringFull("PasswordUpdated",
                    new Object[]{userLogado.getFirstName()},
                    FacesMessage.SEVERITY_INFO,
                    FacesContext.getCurrentInstance());
            return JsfUtil.PAGES_PRINCIPAL_NR;
        } catch (EntityException ex) {
            MensagemUtils.messageFactoringFull(ex.getMessage(),
                    ex.getVariacoes(), FacesMessage.SEVERITY_ERROR,
                    FacesContext.getCurrentInstance());
            logger.info("Erro de atualização: " + userLogado.getUserId(),
                    ex);
            return JsfUtil.MANTEM;
        }
    }

    //====================
    //Getters AND Setters
    //====================
    /**
     * Spring setta o Component atravez deste método.
     *
     * @param authentication Injetado pelo Spring.
     */
    public void setAuthenticationService(
            final AuthenticationService authentication) {
        this.authenticationService = authentication;
    }

    /**
     * Spring setta o Repository atravez deste método.
     *
     * @param uFacade Facade inserido pelo Spring
     */
    public void setUsuarioFacade(final UsuarioFacade uFacade) {
        this.usuarioFacade = uFacade;
    }

    /**
     * Recupera a senha.
     *
     * @return Senha.
     */
    public String getSenha() {
        return senha;
    }

    /**
     * Define a senha.
     *
     * @param newSenha Senha;
     */
    public void setSenha(final String newSenha) {
        this.senha = newSenha;
    }

    /**
     * Informa senha atual.
     *
     * @return Senha atual
     */
    public String getSenhaAtual() {
        return senhaAtual;
    }

    /**
     * Informa senha atual.
     *
     * @param sAtual Senha ataul
     */
    public void setSenhaAtual(final String sAtual) {
        this.senhaAtual = sAtual;
    }
}
